#include <ev.h>
#include <amqpcpp.h>
#include <amqpcpp/libev.h>
#include <openssl/ssl.h>
#include <openssl/opensslv.h>
//这里用到了一个AMQP协议，一个AMQP-CPP库一个RabbitMQ服务，一个libev组件
//其中AMQP协议是用来进行TCP客户端之间的通信协议
//AMQP-CPP库用来使用AMQP协议进行异步I/O（AMQP-CPP库是完全异步的且不需要使用线程）
//RabbitMQ服务用来对协议进行序列化和反序列化
//libev用来对使用AMQP-CPP库的I/O进行监控，并提供了异步I/O的结果处理回调函数框架


int main()
{
    //1.实例化(底层网络通信框架)的I/O事件监控句柄
    auto* loop = EV_DEFAULT;
    //2.实例化libEvHandler句柄，将AMPQ框架与事件关联起来--即使用AMPQ通信是会触发事件
    AMQP::LibEvHandler handler(loop);
    //3.实例化连接对象，可以使用连接对象将RabbitMQ服务器与事件处理关联起来
    AMQP::Address address("amqp://root:123456@127.0.0.1:5672/");
    AMQP::TcpConnection connection(&handler, address);
    //4.实例化信道对象
    AMQP::TcpChannel channel(&connection);
    //5.声明交换机
    channel.declareExchange("test_exchange",AMQP::ExchangeType::direct)
    .onError([](const char* message)
    {
        std::cout<<"声明交换机失败:"<<message<<std::endl;
        exit(0);
    })
    .onSuccess([]()
    {
        std::cout<<"声明交换机成功!"<<std::endl;
    });
    //6.声明交换队列
    channel.declareQueue("test_queue")
    .onError([](const char* message)
    {
        std::cout<<"声明队列失败:"<<message<<std::endl;
        exit(0);
    })
    .onSuccess([]()
    {
        std::cout<<"声明队列成功"<<std::endl;
    });
    //7.管道的交换机和队列进行绑定
    channel.bindQueue("test_exchange","test_queue","test_queue_key")
    .onError([](const char* message)
    {
        std::cout<<"管道的交换机和队列绑定失败:"<<message<<std::endl;
        exit(0);
    })
    .onSuccess([]()
    {
        std::cout<<"管道的交换机和队列绑定成功"<<std::endl;
    });
    //8.向交换机发送信息
    if(channel.publish("test_exchange","test_queue_key","收到你的订阅，感谢!")==false)
    std::cout<<"publish err\n";
    //9.启动底层网络框架--开启I/O
    ev_run(loop,0);
    return 0;
}